package netty.demo_06_HeartBeat;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleStateEvent;

/**
 * Netty心跳检测机制案例
 * 服务端 的 处理器（空闲处理）
 *
 * @author chenyuan
 * @date 2020/11/11 9:31
 */
public class ServerHandler extends ChannelInboundHandlerAdapter {
	/**
	 * 对 空闲事件 的处理
	 *
	 * @param ctx 上下文
	 * @param evt 传递过来的事件
	 * @throws Exception
	 */
	private int list[] = new int[4];

	@Override
	public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
		// 判断这个事件是否是 IdleStateEvent 空闲事件
		if (evt instanceof IdleStateEvent) {
			// 将 event 向下转型 => IdleStateEvent
			IdleStateEvent event = (IdleStateEvent) evt;
			String eventType = null;
			int index = -1;
			// 判断具体是哪一个空闲事件
			switch (event.state()) {
				// 读空闲
				case READER_IDLE:
					eventType = "读空闲";
					index = 0;
					break;
				case WRITER_IDLE:
					eventType = "写空闲";
					index = 1;
					break;
				case ALL_IDLE:
					eventType = "读写空闲";
					index = 2;
					break;
			}
			list[index]++;
			System.out.println("[超时事件] " + ctx.channel().remoteAddress() + " 发生了 " + eventType + "---第" + list[index] + "次");
			System.out.println("服务器进行相应处理");
			if (list[index] >= 3) {
				ctx.channel().close();
				System.out.println("关闭该通道");
			}
		}
	}
}
